..:: Menu ::.. ..:: Lekcja 4: Podstawy Object Pascala część: 6 ::.. ..::Info i Reklamy::..

Tablice

Tablice to zbiór zmiennych tego samego typu. Popatrz zamiast deklarować kilka zmiennych tego samego typu:
var
Zmienna1, Zmienna2, Zmienna3, Zmienna4 : String;
Możesz zapisać to w formie tablicy:
var
Zmienna : array[0..3] of String;
Tablice deklaruje się za pomocą słowa kluczowego array. Następnie w nawiasach klamrowych wpisujesz z ilu elementów ma się składać tablica. W tym wypadku z czterech ( 0 to także element tablicy ). Na końcu jakiego typu mają być elementy tablicy. Teraz jeżeli chcesz poszczególnym elementom przypisać jakieś wartości robisz tak:
Zmienna[0] := 'Adam';
Zmienna[1] := 'Marta';
Zmienna[2] := 'Zuzia';
Zmienna[3] := 'Bronia';
Nic nadzwyczajnego. Elementy tablicy mogą być wykorzystane jak zwykłe zmienne:
ShowMessage(Zmienna[0] + ' ' + Zmienna[1]);
Począwszy od Delphi 4 można deklarować w programie tablice dynamiczne. Tzn., podczas pisania programu nie określasz z ilu elementów będzie się składać tablica - robisz to później.
var Dynamiczna : array of String;
Z ilu elementów składa się tablica? Nie wiadomo. Deklarujesz to później. W tym celu musisz zastosować polecenie SetLength. Oto przykładowy program:
{
Copyright (c) 2001 - Adam Boduch
}

program tablica;

uses
Windows,
Dialogs;

var Tab : array of String; // tablica dynamiczna

begin
SetLength(Tab, 4); // deklarujesz, z ilu elementów będzie się składać tablica
{ wpisujesz elementy }
Tab[0] := 'Adam';
Tab[1] := 'Marta';
Tab[2] := 'Zuzia';
Tab[3] := 'Bronia';

Randomize;
ShowMessage(Tab[Random(4)]);
end.
W tym wypadku w okienku pojawi się losowo wybrany element tablicy. Pytanie: W jakich wypadkach stosować tablice dynamiczne? W takich wypadkach, w których programista sam nie wie podczas pisania programu z ilu elementów będzie się składać tablica. Może to być np. określane podczas trwania programu przez użytkownika.
Z tablicami wiążą się jeszcze dwa bardzo przydatne polecenia - Low i High. Podają one kolejno najmniejszy element tablicy jak i największy. Jeżeli więc tablica wygląda tak:
var Tab : array[10..100] of String;
To zastosowanie polecenia Low(Tab) zwróci liczbę 10 - pierwszy element tablicy. Polecenie High natomiast zwraca liczbę 100 - ostatni element tablicy.
Pozostało jeszcze omówienie tablic dwuwymiarowych. Oczywiście tablice można deklarować także jako stałe.
const
Tab : array[0..1, 0..2] of String =
(('Fiat', 'Uno', '45 KM'),
('Fiat', 'Punto', '80 KM'));
W tym wypadku elementów będzie dwa, ale każdy z elementów będzie zawierał po 3 pozycje. Może z początku nie będzie to dla Ciebie jasne. Teraz trzeba odwołać się do poszczególnych elementów. Np. element 'Fiat' znajduje się pod indeksem [0][0].
const
Tab : array[0..1, 0..2] of String =
(('Fiat', 'Uno', '45 KM'),
('Fiat', 'Punto', '80 KM'));

begin
ShowMessage(Tab[0][0] + Tab[0][1] + Tab[0][2]);
end.
Element 'Uno' jest pod indeksem [0][1]. Np. element 'Punto' jest pod indeksem [1][1]. Rozumiesz?

Procedury i funkcje

Procedury i funkcje obecne są w każdym języku programowania ( w C++ są tylko funkcje ). Są to wydzielone bloki kodu, które wykonują jakąś czynność. Np. potrzebujesz wiele razy użyć jakiegoś kodu. Żeby nie zapisywać tego tyle razy możesz użyć procedury. Piszesz kod tylko raz a jeżeli będziesz go potrzebował w dalszej części programu to po prostu piszesz nazwę tej procedury.
Procedury deklaruje się tak:
procedure MojaPierwszProcedura;
begin
{ tutaj wpisujesz kod procedury }
end;
Funkcje deklaruje się tak:
function MojaPierwszaFunkcja : Integer;
begin
{ kod funkcji }
end;
Zauważ specyficzną budowę funkcji. Funkcja ZAWSZE musi zwrócić rezultat wykonanej operacji, a procedura nie. Napiszemy program, który będzie podnosił liczbę do potęgi. Ale od początku. Funkcje mogą zawierać parametry. Nie muszą, ale mogą. Parametry funkcji to dane potrzebne do jej wykonania. Oto przykład deklaracji funkcji z parametrem:
function DoPotegi(Liczba : Integer) : Integer;
W takim wypadku jeżeli będziesz chciał wykonać funkcję DoPotegi będziesz musiał podać jeden parametr, którym jest liczba typu Integer. Oczywiście parametrów może być o wiele więcej:
function DoPotegi(Liczba1 : Integer; Liczba2 : Integer) : Integer;
Żeby ułatwić sobie zadanie możesz to napisać w ten posób:
function DoPotegi(Liczba1, Liczba2 : Integer) : Integer;
To co? Piszemy ten program? Cały kod wygląda tak:
{
Copyright (c) 2001 - Adam Boduch
}

program potega;

uses
Windows, SysUtils, Dialogs;

function DoPotegi(Liczba: Integer) : Integer;
begin
Result := Liczba * Liczba;
end;

begin
ShowMessage(IntToStr(DoPotegi(2)));
end.
Zwróć uwagę na naszą funkcje. Po słowie kluczowym Result deklarujemy rezultat wykonanej funkcji. Rezultatem jest mnożenie dwóch parametrów dzięki czemu mamy funkcję, która podnosi liczbę do potęgi. W programie rezultat wykonania procedury zostaje wyświetlony w okienku. Teraz rozumiesz czym się różni procedura od funkcji? Gdybyśmy zamiast funkcji użyli procedury to program by się nie skompilował ( procedura nie może zwrócić rezultatu wykonanej operacji ).
Bodajże także od Delphi 4 wprowadzono możliwość tzw. przeciążania procedur i funkcji. Polega to na tym, że w programie mogą istnieć dwie procedury/funkcje o tej samej nazwie pod warunkiem, że ich parametry będą różne. W takim wypadku funkcję/procedurę trzeba opatrzyć dodatkowo klauzurą overload.
function DoPotegi(Liczba: Integer) : Integer; overload;
begin
Result := Liczba * Liczba;
end;

function DoPotegi(Liczba: Currency) : Currency; overload;
begin
Result := Liczba * Liczba;
end;
W pierwszym przypadku Liczba jest typu Integer, a w drugim typu Currency. Przypomnę, że typ Currency to typ zmiennoprzecinkowy. Teraz możemy wykorzystać jedną bąć drugą funkcje:
DoPotegi(2.2);
Pytanie: "Skąd program ma wiedzieć, która funkcję wykorzystać?". Po parametrze. Jeżeli parametr jest zmiennoprzecinkowy to znaczy, że chcesz wywołać funkcję drugą, jeżeli jest to liczba cała - pierwszą procedurę.
Istnieje możliwość deklaracji "procedury w procedurze". Np:
procedure Glowna;
procedure Child;
begin
{ kod procedury }
end;
begin

end;
Teraz możesz procedurę Child używać wiele razy w procedurze Glowna jeżeli nie chcesz wiele razu przepisywać treści procedury Child.
Deklarując procedurę lub funkcję można przypisać im wartości domyślne tak jak w wypadku zmiennych. Oto przykład:
procedure NowaGra(ImieGracza : String; NumerGracza : Integer = 1);
Teraz jeżeli chcesz daną procedurę wywołać możesz, ale nie musisz podawać drugiego parametru:
procedure NowaGra('Bleblelele');
Albo:
procedure NowaGra('Bleblelele', 2);
Tak i tak będzie dobrze.
<--- Wstecz | Dalej --->

   
©Copyright by garUs